<?php

namespace app\index\controller;
/**
 * 容器和依赖注入的原理
 * @author sunhe
 * 1.任何URL访问，最终都是定位到控制器中，由控制其中某个具体的方法去执行
 * 2.一个控制器对应一个类，如果这些类需要进行统一管理，怎么办？
 * 3.用容器进行类管理，还可以将类的实例作为参数，传递给类方法进行调用，自动触发依赖注入
 * 4.依赖注入：将对象类型的数据，以参数的方式传递到方法的参数列表中
 * 5.URL访问：通过GET方法传递参数
 * 6.如何传递对象到当前方法中
 * 7.可通过依赖注入解决传递对象的问题
 */
class Demo1{
	public function getName($name = 'SunRock'){
		return 'Hello '.$name;
	}
	
	public function getMethod(\app\common\Temp $temp){
// 		\app\common\Temp $temp 等于 $temp = new \app\common\Temp();
// 		\app\common\Temp $temp也可以写成 Temp $temp 但要在class外use \app\common\Temp
		$temp->setName('name');
		return $temp->getName();
	}
	
	/**
	 * 绑定一个类到容器中
	 */
	public function bindClass(){
		//1.将类放到容器中，相当于注册到容器中
		\think\Container::set('temp','\app\common\Temp');
		
		//2.将容器中的类实例化，并取出。实例化时可调用构造函数
		$temp = \think\Container::get('temp',['name'=>'孙贺']);
		
		//用助手函数也可以实现
// 		bind('temp','\app\common\Temp');
// 		$temp = app('temp',['name'=>'helper']);
		
		return $temp->getName();
		
		
	}
	
	/*
	 * 绑定一个闭包到容器：闭包可以理解成一个匿名函数
	 */
	public function bindClosure(){
		//1.将闭包放到容器中，相当于注册到容器中
		bind('demo',function($domain){
			return $domain;
		});
		//2.将闭包中的方法取出来
		$demo = app('demo',['domain'=>'www.baidu.com']);
		return $demo;
	}
}